var a = 1
function fn() {
    var a = 2
    function a() { }
    console.log(a);
}
fn()

//预编译步骤，创建一个调用栈，先在底部创建一个全局执行上下文板块，也就是全局作用域入栈
//全局执行上下文内有两块，一块为变量环境，用来装变量的
//第一步就是将a=undefind和fn()=function加入到变量环境中去（预编译，还未赋值）
//再对a=1进行执行，a=1,再对fn()函数进行执行，但得先对fn()函数内部进行编译，从而
//使得又一个板块入栈（也就是函数fn的执行上下文），内部也有变量环境板块，和另一个板块
//然后对函数fn内进行编译，先是a=undefind，再是a=function，因为只有一个a
//再接着就是执行fn函数，先执行a=2，a()只是声明，并不需要执行，再执行log(a)
//执行log(a)时，先在fn()函数内找a如果找不到再出去全局作用域中找，也就是下一个栈
//而非上一个栈，因为栈结构只能先访问上层后才能访问下层，所以console.log(a)输出2
//见"D:\前端ai图片资料\编译流程.png"
